package xulong.com.weiyulinked.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import xulong.com.weiyulinked.mapper.MessageSessionMapper;
import xulong.com.weiyulinked.mapper.UserInfoMapper;
import xulong.com.weiyulinked.model.MessageSession;
import xulong.com.weiyulinked.model.SessionUser;
import xulong.com.weiyulinked.model.UserInfo;
import xulong.com.weiyulinked.model.message;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@Slf4j
public class MessageSessionService {
    @Autowired
    private UserInfoMapper userInfoMapper;
    @Autowired
    private MessageSessionMapper messageSessionMapper;
    //获取会话列表
    public List<SessionUser> getSessionList(Integer userId) {
        List<SessionUser> sessionUsers = new ArrayList<>();
        //从数据库中查询该用户对应的会话ID
        List<Integer> sessionIds = messageSessionMapper.getSessionIdsByUserId(userId);
        //如果会话ID为空，直接返回
        if (sessionIds.isEmpty()) {
            return null;
        }

        for (Integer sessionId : sessionIds) {
            //通过会话ID查到最后一条消息信息和时间
            message lastMessage = messageSessionMapper.getLastMessageBySessionId(sessionId);
            //通过会话ID查到好友名字
            UserInfo info = userInfoMapper.selectById(messageSessionMapper.selectFriendIdBySessionId(sessionId, userId));
            String username = info.getUsername();
            //将最后一条消息信息和时间填入到会话用户对象中
            SessionUser sessionUser = new SessionUser();
            sessionUser.setUsername(username);
            //最后一条消息为空
            if (lastMessage == null) {
                sessionUser.setLastMessage("");
                sessionUser.setLastMessageTime(new Date());
            }else{
                sessionUser.setLastMessage(lastMessage.getContent());
                sessionUser.setLastMessageTime(lastMessage.getPostTime());
            }
            sessionUser.setSessionId(sessionId);
            sessionUsers.add(sessionUser);
        }
        //TODO 通过会话ID查询会话信息，将会话信息填入到同一返回结果中
        return sessionUsers;
    }

    @Transactional
    //使三次数据库插入确保原子性
    public Integer createSession(Integer userId, Integer friendId) {
        // 检查会话是否存在
        Integer existingSessionId = messageSessionMapper.selectSessionIdByFriendId(userId, friendId);
        if (existingSessionId != null) {
            log.info("会话已存在，会话ID为：{}", existingSessionId);
            return existingSessionId;
        }
        //向message_session表中插入数据 参数只是为了获取到自增ID
        MessageSession messageSession = new MessageSession();
        messageSessionMapper.createSession(messageSession);
        //获取会话ID
        Integer sessionId = messageSession.getId();
        log.info("创建会话成功，会话ID为：{}", sessionId);
        //向message_session_user表中插入数据  自己与会话之间的关系
        messageSessionMapper.insertMessageSessionUser1(sessionId, userId);
        //向message_session_user表中插入数据  好友与会话之间的关系
        messageSessionMapper.insertMessageSessionUser2(sessionId, friendId);
        return sessionId;
    }

    public SessionUser checkSessionExists(Integer userId, Integer friendId) {
        //检查会话是否存在
        Integer sessionId = messageSessionMapper.selectSessionIdByFriendId(friendId, userId);
        if (sessionId==null) {
            //会话不存在
            SessionUser sessionUser = new SessionUser();
            sessionUser.setExists(false);
            return sessionUser;
        }
        //会话存在
        SessionUser sessionUser = new SessionUser();
        sessionUser.setExists(true);
        sessionUser.setSessionId(sessionId);
        return sessionUser;
    }

    public List<message> getMessage(Integer sessionId) {
        //从数据库中查询会话中的历史消息
        List<message> messageList = messageSessionMapper.getMessage(sessionId);
        for (message message : messageList) {
            //通过用户ID查询用户名
            UserInfo userInfo = userInfoMapper.selectById(message.getFromId());
            message.setFromName(userInfo.getUsername());
        }
        return messageList;
    }
}
